package com.moujitx.wecom.controller;

import java.util.List;
import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.moujitx.wecom.common.Result;
import com.moujitx.wecom.common.Wecom;
import com.moujitx.wecom.entity.WecomConfig;
import com.moujitx.wecom.repository.WecomConfigRepository;

/**
 * 企业微信配置控制器
 */
@RestController
@RequestMapping("/api/config")
public class WecomConfigController {

    @Autowired
    private WecomConfigRepository wecomConfigRepository;
    
    /**
     * 获取所有配置
     * @return 配置列表
     */
    @GetMapping
    public Result getAllConfigs() {
        List<WecomConfig> configs = wecomConfigRepository.findAll();
        return Result.ok(configs);
    }
    
    /**
     * 根据ID获取配置
     * @param id 配置ID
     * @return 配置信息
     */
    @GetMapping("/{id}")
    public Result getConfigById(@PathVariable Long id) {
        Optional<WecomConfig> configOpt = wecomConfigRepository.findById(id);
        if (!configOpt.isPresent()) {
            return Result.serverError("配置不存在");
        }
        return Result.ok(configOpt.get());
    }
    
    /**
     * 添加配置
     * @param config 配置信息
     * @return 添加结果
     */
    @PostMapping
    public Result addConfig(@RequestBody WecomConfig config) {
        // 验证配置是否有效
        String accessToken = Wecom.getAccessToken(config.getCorpId(), config.getSecret());
        if (accessToken == null) {
            return Result.serverError("配置无效，无法获取访问令牌");
        }
        
        WecomConfig savedConfig = wecomConfigRepository.save(config);
        return Result.ok(savedConfig);
    }
    
    /**
     * 更新配置
     * @param id 配置ID
     * @param config 配置信息
     * @return 更新结果
     */
    @PutMapping("/{id}")
    public Result updateConfig(@PathVariable Long id, @RequestBody WecomConfig config) {
        if (!wecomConfigRepository.existsById(id)) {
            return Result.serverError("配置不存在");
        }
        
        config.setId(id);
        
        // 验证配置是否有效
        String accessToken = Wecom.getAccessToken(config.getCorpId(), config.getSecret());
        if (accessToken == null) {
            return Result.serverError("配置无效，无法获取访问令牌");
        }
        
        WecomConfig updatedConfig = wecomConfigRepository.save(config);
        return Result.ok(updatedConfig);
    }
    
    /**
     * 删除配置
     * @param id 配置ID
     * @return 删除结果
     */
    @DeleteMapping("/{id}")
    public Result deleteConfig(@PathVariable Long id) {
        if (!wecomConfigRepository.existsById(id)) {
            return Result.serverError("配置不存在");
        }
        
        wecomConfigRepository.deleteById(id);
        return Result.ok("配置已删除");
    }
    
    /**
     * 测试配置
     * @param id 配置ID
     * @return 测试结果
     */
    @GetMapping("/test/{id}")
    public Result testConfig(@PathVariable Long id) {
        Optional<WecomConfig> configOpt = wecomConfigRepository.findById(id);
        if (!configOpt.isPresent()) {
            return Result.serverError("配置不存在");
        }
        
        WecomConfig config = configOpt.get();
        
        // 获取访问令牌
        String accessToken = Wecom.getAccessToken(config.getCorpId(), config.getSecret());
        if (accessToken == null) {
            return Result.serverError("配置无效，无法获取访问令牌");
        }
        
        // 发送测试消息
        String result = Wecom.sendMarkdownMessage(accessToken, "@all", "这是一条测试消息，发送时间：" + System.currentTimeMillis(), config.getAgentId(), config.getId());
        return Result.ok(result);
    }
}